feat(deep-scan): Deep Scan Runtime Service Foundation#44
Merged
Conversation
Yeni araç ilk kez bağlandığında çalışacak Deep Scan sürecinin merkezi runtime
FOUNDATION katmanı: durum · faz · ilerleme · keşif sayaçları · olaylar · güvenli
çalışma koşulları.
deepScanModel.ts (yeni, SAF): 9 durum + 12 faz + mod kararı + progress kuralları
+ gizlilik süzgeci. Servis import'u YOK, yan etki YOK.
- ACTIVE_PHASES (araca sorgu: kimlik/protokol/ECU/PID/DID/firmware) ve
OFFLINE_PHASES (analiz/fingerprint/knowledge/evidence/change/rapor) ayrımı.
- resolveScanMode(): önceki tamamlanmış tarama yoksa FULL_SCAN, varsa
CHANGE_CHECK (aynı araca her bağlantıda tam tarama YOK — vizyon kuralı).
- normalizeFingerprintHash(): 8-64 hex; 17 karakter (VIN uzunluğu) REDDEDİLİR.
- sanitizeText(): VIN/MAC/koordinat/ham hex/secret → [redacted].
deepScanRuntimeService.ts (yeni): saf durum makinesi. Araca TEK BİR sorgu bile
göndermez; hiçbir OBD/discovery/fingerprint/learning servisini import etmez
(kaynak-metin kilidi: tek import ./deepScanModel); timer/abonelik açmaz →
import edilmesi yan etki üretmez; SystemBoot'a BAĞLI DEĞİL (kilitli test).
KONTAK GÜVENLİĞİ (fail-closed): depoda kontak/ACC yayan GERÇEK kaynak YOK
(obdDiagnosticTypes.IGNITION_OFF yalnız bir mesaj sabiti — hiçbir yerde emit
edilmiyor). ignitionConfirmed üç durumlu (true/false/null=bilinmiyor), yalnız
setIgnitionConfirmed() ile dışarıdan beslenir — servis kontağı ASLA tahmin etmez.
true DEĞİLSE: aktif faz açılmaz, aktif keşif kaydı (ECU/PID/DID/firmware) kabul
edilmez, status waiting_for_ignition'da kalır; yalnız offline fazlar çalışır.
Tarama sırasında kontak kaybedilirse aktif durumdan düşülür.
Progress deterministik + monotonik: 0-100 clamp, geriye düşmez, faz tabanları,
complete→100, fail/cancel'da mevcut değer korunur. Sahte ilerleme üretilmez.
Fail-soft: kritik faz (kimlik/protokol) hatası → failed; kritik olmayan faz →
uyarı + atlanır. Dinleyici hatası yutulur+raporlanır, servisi çökertmez.
Bounded: warnings(16) · listeners(32, duplicate'siz) · dedup anahtarları(4096).
Gizlilik: snapshot/rapor/olay zarfı Object.freeze'li; ham VIN/MAC/koordinat/
CAN frame/API key giremez. ECU adresleri yalnız dedup anahtarı olarak bellekte,
snapshot'a yalnız SAYIM olarak yansır.
Assistant Context (PR #43) alan-uyumlu (completed/progress/newDiscoveriesCount/
changedFirmware/changedECU) ama useAssistantContextStore DEĞİŞTİRİLMEDİ; bu PR
#43'e BAĞIMLI DEĞİL (main'den bağımsız branch).
KAPSAM DIŞI: gerçek ECU taraması, native OBD, PID/DID formülü, SQL/Supabase,
cloud, UI, SystemBoot wiring, kalıcı tarama geçmişi.
Test: 57 test. tsc -b temiz, lint temiz, tam suite 2660 yeşil (regresyon yok).
Ledger #29 (cihazda test bekliyor).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q74z6tXWP39iBSXZYnLQW1
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…e-service # Conflicts: # docs/DEVICE_VALIDATION_LEDGER.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Amaç
Yeni araç ilk kez bağlandığında çalışacak Deep Scan sürecinin merkezi runtime foundation katmanı: durum · ilerleme · keşif sonuçları · olaylar · güvenli çalışma koşulları.
Bu PR gerçek tarama yapmaz. Araca tek bir sorgu bile göndermez. Native OBD, PID/DID formülü, SQL/Supabase, cloud, UI, SystemBoot wiring ve Assistant Context wiring kapsam dışı.
main'den bağımsız branch — PR #43'e bağımlı değil, diff temiz.Yeni dosyalar
src/platform/deepScan/deepScanModel.ts— saf tipler, sabitler, kurallarsrc/platform/deepScan/deepScanRuntimeService.ts— durum makinesisrc/platform/deepScan/index.ts— barrelsrc/__tests__/deepScanRuntimeService.test.ts— 57 testDeğişen dosyalar
docs/DEVICE_VALIDATION_LEDGER.md— kayıt feat(vehicle): Üretici Zekâ Motoru Temeli (PR-29) #29 🔴Başka hiçbir dosyaya dokunulmadı.
Repo denetiminde kontak/ACC durumunu yayan gerçek bir kaynak bulunamadı:
obdDiagnosticTypes.IGNITION_OFFyalnız bir mesaj sabiti — kod tabanında hiçbir yerde emit edilmiyor.commandExecutor.ignitionOnçağırandan gelen bir parametre, kaynak değil.Bu yüzden kontak formülü uydurulmadı.
ignitionConfirmedüç durumlu:true·false·null(bilinmiyor). YalnızsetIgnitionConfirmed()ile dışarıdan beslenir — servis kontağı asla tahmin etmez.Durum modeli
idle·waiting_for_ignition·preparing·scanning·analyzing·completed·paused·cancelled·failedcompleted/cancelled/failedterminaldir — mutasyon kabul etmez,reset()gerekir.Faz modeli — AKTİF / OFFLINE ayrımı
vehicle_identity·protocol_detection·ecu_discovery·standard_pid_discovery·manufacturer_did_discovery·firmware_inventoryignitionConfirmed === truecapability_analysis·fingerprint_update·knowledge_update·evidence_update·change_detection·report_generationvehicle_identity(Mode 09 VIN sorgusu) vefirmware_inventory(DID sorgusu) araca istek gönderdiği için aktif sayıldı.Kritik fazlar:
vehicle_identity,protocol_detection→ hataları taramayıfailedyapar. Diğer fazların hatası uyarıya çevrilir ve faz atlanır (fail-soft).Kontak güvenliği (fail-closed)
ignitionConfirmed !== trueolduğunda:waiting_for_ignition,ignition_requiredolayı, faz değişmez, progress artmaz.recordEcuDiscovery/recordPidDiscovery/recordDidDiscovery/recordFirmwareResult) reddedilir — kontak kapalıyken araca sorgu gitmiş sayılmaz.Tarama sırasında kontak kaybedilirse (
scanning/preparing→false/null) durum otomatikwaiting_for_ignition'a düşer. Duraklatılmış aktif faz, kontak yokkenresumeScan()ile geri açılmaz.null(bilinmiyor) kontak açık sayılmaz — bu PR'da aktif tarama otomatik başlatılmaz.Full Scan / Change Check kararı
Aynı araca her bağlantıda yeniden tam tarama yapılmaz. Kalıcı geçmiş deposu bu PR'ın kapsamı değil —
hasCompletedScanBeforeçağırandan gelir; süreç yeniden başlayınca durumidle'a döner. Karar modeli ve alanlar hazır.Event modeli
scan_started·ignition_required·phase_changed·progress_changed·ecu_discovered·pid_discovered·did_discovered·firmware_checked·change_detected·scan_paused·scan_resumed·scan_completed·scan_failed·scan_cancelledDinleyici kümesi bounded (32),
Setsemantiğiyle duplicate oluşmaz, bir dinleyicinin hatası yakalanır +warnings'e raporlanır ve servisi çökertmez (olay yeniden yayılmaz → sonsuz döngü yok). İterasyon kopya üstünde döner, böylece dinleyici içindeunsubscribe()çağrılırsa bozulmaz. Olay zarfı ve taşıdığı snapshot dondurulmuştur.Progress modeli
Deterministik ve monotonik:
[0,100]clamp (NaN/Infinity/sayı olmayan → 0), aynı veya geri fazda düşmez, faz değişiminde faz tabanına yükselir,completeScan()→ 100,failScan()/cancelScan()mevcut değeri korur (sahte 100 yazılmaz). Faz içi ince ilerleme yalnızupdateProgress()ile ölçülmüş değer olarak gelir — sahte ilerleme üretilmez.Performans
Timer yok, abonelik yok, hot-path yok. Pasifken (tarama başlatılmamışken) yük sıfır — API çağrılmadıkça hiçbir kod çalışmaz, bu yüzden runtime scheduler'a görev de kaydedilmez. Tüm koleksiyonlar bounded: warnings 16 · listeners 32 · dedup anahtarları 4096. Yeni bağımlılık yok.
Gizlilik
Snapshot/rapor/olay zarfı
Object.freeze'li. Ham VIN · MAC · koordinat · ham CAN frame · API key/secret giremez:normalizeFingerprintHash()yalnız 8–64 hex kabul eder ve 17 karakterlik girdiyi (VIN uzunluğu) reddeder → VIN hash yerine geçirilemez.warnings,errorCode, rapor notu)sanitizeText()ile VIN/MAC/koordinat/8+ hex/secret kalıplarını[redacted]yapar.Assistant Context uyumu
Snapshot alanları PR #43'ün
deepScanbölümüyle alan-uyumlu:completed(status) ·progress(progressPercent) ·newDiscoveriesCount·changedFirmware·changedEcu.useAssistantContextStorebu PR'da değiştirilmedi.Foundation güvenceleri (testle kilitli)
deepScanRuntimeService.ts'in tek import'u./deepScanModel— hiçbir OBD/discovery servisi import edilmiyor (kaynak-metin kilidi).SystemBoot.tskaynağındadeepScan/DeepScangeçmiyor — wiring yok.idle, dinleyicisiz, dispose edilmemiş — yan etki yok.Testler — 57 test
İstenen 30 senaryonun hepsi kapsandı: başlangıç idle (2) · FULL_SCAN/CHANGE_CHECK (3) · kontak güvenliği (10) · faz + progress (6) · keşif sayaçları + duplicate + değişiklik tespiti (8) · warnings bounded + fail-soft (3) · dinleyiciler (4) · yaşam döngüsü: start idempotent, cancel, pause/resume, reset, dispose (7) · immutability + girdi mutasyonsuzluğu (3) · gizlilik (6) · yan etki/wiring yok (5).
CI beklentisi
Yerel:
tsc -btemiz ·eslinttemiz · 170 dosya / 2660 test yeşil (baseline 2603 + 57; regresyon yok).Risk
Düşük. Tamamen yeni, izole bir modül; mevcut hiçbir çağrı yolu değişmedi. Servis import edilmediği ve API'si çağrılmadığı sürece etkisi sıfır. Araca sorgu gönderme yeteneği hiç yok — orchestration ayrı PR. Asıl risk o PR'da doğar: gerçek ignition kaynağı bulunana kadar aktif tarama otomatik tetiklenmemeli; bu servis fail-closed olduğu için kontak
nulliken aktif faz zaten açılmıyor.Ledger
Kayıt #29 — 🔴 cihazda test edilmedi. Numara 29 seçildi çünkü 26/27/28 açık PR'larda rezerve (#41, #42, #43).
🤖 Generated with Claude Code
https://claude.ai/code/session_01Q74z6tXWP39iBSXZYnLQW1